import socket
import os
from time import sleep
os.chdir(os.path.dirname(__file__)) 
import logging
# 此脚本模拟prepare命令的传输，用于测试
# 需用demo软件提前连接到探测器，然后关闭demo软件再启动脚本

class HMI:

    def __init__(self, target_ip='192.168.10.40', target_port=32897, self_ip='192.168.10.100', self_port=32896):
        self.target_ip = target_ip
        self.target_port = target_port
        self.self_ip = self_ip
        self.self_port = self_port
        # 创建一个 UDP 套接字
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        # 如果需要，可以绑定到特定的本地 IP 和端口
        self.sock.bind((self.self_ip, self.self_port))
        # 设置超时为5秒
        self.sock.settimeout(1)
        # 设置接收缓冲区大小（以字节为单位）
        recv_buf_size = 65536  # 例如，设置为64KB
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, recv_buf_size)

        # 设置发送缓冲区大小（以字节为单位）
        send_buf_size = 65536  # 例如，设置为64KB
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, send_buf_size)


    def send_prepare(self):
        try:
            with open(r'./prepare_cmd.bin', 'rb') as file:
                data = file.read()
                # 由于UDP包大小的限制，你可能需要将文件分成多个包发送
                # 这里我们假设文件不是很大，可以一次性发送
                # 如果文件很大，你需要实现分包逻辑
                # 发送数据
                self.sock.sendto(data, (self.target_ip, self.target_port))
                #print(f"Sent message: '{data}' to {self.target_ip}:{self.target_port}")    
        except Exception as e:
            print(f"Error sending message: {e}")
    def getdata(self):
        try:
            data, addr = self.sock.recvfrom(1083*10)
            return data
            # 处理接收到的数据
        except socket.timeout:
            print("接收数据时超时")
            return -1
    def check_prepare(self):
        self.send_prepare()
        self =hmi.getdata()
        sleep(1)
    # 添加一个关闭套接字的方法，以便在不再需要时清理资源
    def close(self):
        self.sock.close()
        print("Socket closed.")

# 使用示例
if __name__ == '__main__':
    # 配置日志记录
    logging.basicConfig(
    level=logging.DEBUG,  # 设置日志级别
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',  # 设置日志格式
    datefmt='%Y-%m-%d %H:%M:%S',  # 设置时间格式
    handlers=[
        logging.FileHandler('app.log'),  # 将日志写入文件
        logging.StreamHandler()  # 同时在控制台输出
    ]
    )
    hmi = HMI()
    i=0
    cnt=0
    err_cnt=0
    while True:
        cnt=cnt+1
        size=0
        hmi.send_prepare()
        for i in range(0,5):
            data =hmi.getdata()
            if(data==-1):
                err_cnt=err_cnt+1
                continue
            else:
                err_cnt=0
            size=data.__sizeof__()+size
        logging.info('getdata success,size=' + str(size) + '   bytes num=' + str(cnt)+'    err cnt='+str(err_cnt))
        sleep(1)
    # 当不再需要 HMI 实例时，关闭套接字
    hmi.close()
